C.S.Burner 🪙 ━►🔥GIT Node
meshchatx/src/ssl_self_signed.py master (f0f6ed57) Text, 4.82 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Self-signed TLS certificate generation for local HTTPS."""
Tff7b72import T7ee787ipaddress
Tff7b72import T7ee787os
Tff7b72import T7ee787socket
Tff7b72from T7ee787datetime Tff7b72import Te6edf3UTCTb4b4b4, Te6edf3datetimeTb4b4b4, Te6edf3timedelta
Tff7b72from T7ee787cryptography Tff7b72import Te6edf3x509
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787backends Tff7b72import Te6edf3default_backend
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787primitives Tff7b72import Te6edf3hashesTb4b4b4, Te6edf3serialization
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787primitivesT7ee787.T7ee787asymmetric Tff7b72import Te6edf3rsa
Tff7b72from T7ee787cryptographyT7ee787.T7ee787x509T7ee787.T7ee787oid Tff7b72import Te6edf3NameOID
Te6edf3_SKIP_IPS Tff7b72= Tb4b4b4{
Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Ta5d6ff"Ta5d6ff0.0.0.0Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Ta5d6ff"Ta5d6ff255.255.255.255Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Ta5d6ff"Ta5d6ff::Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ff_dns_nameTb4b4b4(Te6edf3valueTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3host Tff7b72= Tb4b4b4(Te6edf3value Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3host Tff7b72or Te6edf3host Tff7b72in Tb4b4b4{Ta5d6ff"Ta5d6fflocalhostTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff(none)Ta5d6ff"Tb4b4b4}Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Te6edf3hostTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72pass
Tff7b72if Tffa657anyTb4b4b4(Te6edf3chTff7b72.Td2a8ffisspaceTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3ch Tff7b72in Te6edf3hostTb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff*Ta5d6ff" Tff7b72in Te6edf3hostTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3x509Tff7b72.Td2a8ffDNSNameTb4b4b4(Te6edf3hostTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Tf85149TypeErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_ip_nameTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3text Tff7b72= Te6edf3valueTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ff%Ta5d6ff" Tff7b72in Te6edf3textTb4b4b4:
Te6edf3text Tff7b72= Te6edf3textTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3addr Tff7b72= Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3addr Tff7b72= Te6edf3value
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Te6edf3addr Tff7b72in Te6edf3_SKIP_IPS Tff7b72or Te6edf3addrTff7b72.Td2a8ffis_unspecified Tff7b72or Te6edf3addrTff7b72.Td2a8ffis_multicastTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3x509Tff7b72.Td2a8ffIPAddressTb4b4b4(Te6edf3addrTb4b4b4)
Tff7b72def Td2a8ffcollect_tls_san_entriesTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""SAN names for loopback, hostname, and local interface addresses."""
Te6edf3entries Tff7b72= Tb4b4b4[
Te6edf3x509Tff7b72.Td2a8ffDNSNameTb4b4b4(Ta5d6ff"Ta5d6fflocalhostTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3x509Tff7b72.Td2a8ffIPAddressTb4b4b4(Te6edf3ipaddressTff7b72.Td2a8ffIPv4AddressTb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3x509Tff7b72.Td2a8ffIPAddressTb4b4b4(Te6edf3ipaddressTff7b72.Td2a8ffIPv6AddressTb4b4b4(Ta5d6ff"Ta5d6ff::1Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Te6edf3seen Tff7b72= Tb4b4b4{Tb4b4b4(Ta5d6ff"Ta5d6ffdnsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocalhostTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffipTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffipTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff::1Ta5d6ff"Tb4b4b4)Tb4b4b4}
Tff7b72def Td2a8ff_addTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3entry Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3entryTb4b4b4, Te6edf3x509Tff7b72.Td2a8ffDNSNameTb4b4b4)Tb4b4b4:
Te6edf3key Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffdnsTa5d6ff"Tb4b4b4, Te6edf3entryTff7b72.Td2a8ffvalueTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3key Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffipTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffvalueTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3key Tff7b72in Te6edf3seenTb4b4b4:
Tff7b72return
Te6edf3seenTff7b72.Td2a8ffaddTb4b4b4(Te6edf3keyTb4b4b4)
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)
Te6edf3hostnames Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3getter Tff7b72in Tb4b4b4(Te6edf3socketTff7b72.Td2a8ffgethostnameTb4b4b4, Te6edf3socketTff7b72.Td2a8ffgetfqdnTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3name Tff7b72= Te6edf3getterTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3nameTb4b4b4:
Te6edf3hostnamesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ff.Ta5d6ff" Tff7b72not Tff7b72in Te6edf3nameTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3hostnamesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3nameTffd700}Ta5d6ff.localTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Te6edf3hostnamesTb4b4b4:
Te6edf3_addTb4b4b4(Te6edf3_dns_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)
Te6edf3_addTb4b4b4(Te6edf3_ip_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Tffa657listTb4b4b4(Te6edf3hostnamesTb4b4b4) Tff7b72+ Tb4b4b4[Ta5d6ff"Ta5d6fflocalhostTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3infos Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72continue
Tff7b72for Te6edf3info Tff7b72in Te6edf3infosTb4b4b4:
Te6edf3sockaddr Tff7b72= Te6edf3infoTb4b4b4[T79c0ff4Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3sockaddrTb4b4b4:
Tff7b72continue
Te6edf3_addTb4b4b4(Te6edf3_ip_nameTb4b4b4(Te6edf3sockaddrTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3entries
Tff7b72def Td2a8ffgenerate_ssl_certificateTb4b4b4(Te6edf3cert_pathTb4b4b4: Tffa657strTb4b4b4, Te6edf3key_pathTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Generate a self-signed SSL certificate for local HTTPS.
Args:
cert_path: Path where the certificate will be saved
key_path: Path where the private key will be saved
"""
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3cert_pathTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3key_pathTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3private_key Tff7b72= Te6edf3rsaTff7b72.Td2a8ffgenerate_private_keyTb4b4b4(
Te6edf3public_exponentTff7b72=T79c0ff65537Tb4b4b4,
Te6edf3key_sizeTff7b72=T79c0ff2048Tb4b4b4,
Te6edf3backendTff7b72=Te6edf3default_backendTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3subject Tff7b72= Te6edf3issuer Tff7b72= Te6edf3x509Tff7b72.Td2a8ffNameTb4b4b4(
Tb4b4b4[
Te6edf3x509Tff7b72.Td2a8ffNameAttributeTb4b4b4(Te6edf3NameOIDTff7b72.Td2a8ffCOUNTRY_NAMETb4b4b4, Ta5d6ff"Ta5d6ffUSTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3x509Tff7b72.Td2a8ffNameAttributeTb4b4b4(Te6edf3NameOIDTff7b72.Td2a8ffSTATE_OR_PROVINCE_NAMETb4b4b4, Ta5d6ff"Ta5d6ffLocalTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3x509Tff7b72.Td2a8ffNameAttributeTb4b4b4(Te6edf3NameOIDTff7b72.Td2a8ffLOCALITY_NAMETb4b4b4, Ta5d6ff"Ta5d6ffLocalTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3x509Tff7b72.Td2a8ffNameAttributeTb4b4b4(Te6edf3NameOIDTff7b72.Td2a8ffORGANIZATION_NAMETb4b4b4, Ta5d6ff"Ta5d6ffReticulum MeshChatXTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3x509Tff7b72.Td2a8ffNameAttributeTb4b4b4(Te6edf3NameOIDTff7b72.Td2a8ffCOMMON_NAMETb4b4b4, Ta5d6ff"Ta5d6fflocalhostTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Te6edf3cert Tff7b72= Tb4b4b4(
Te6edf3x509Tff7b72.Td2a8ffCertificateBuilderTb4b4b4(Tb4b4b4)
Tff7b72.Td2a8ffsubject_nameTb4b4b4(Te6edf3subjectTb4b4b4)
Tff7b72.Td2a8ffissuer_nameTb4b4b4(Te6edf3issuerTb4b4b4)
Tff7b72.Td2a8ffpublic_keyTb4b4b4(Te6edf3private_keyTff7b72.Td2a8ffpublic_keyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72.Td2a8ffserial_numberTb4b4b4(Te6edf3x509Tff7b72.Td2a8ffrandom_serial_numberTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72.Td2a8ffnot_valid_beforeTb4b4b4(Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Te6edf3UTCTb4b4b4)Tb4b4b4)
Tff7b72.Td2a8ffnot_valid_afterTb4b4b4(Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Te6edf3UTCTb4b4b4) Tff7b72+ Te6edf3timedeltaTb4b4b4(Te6edf3daysTff7b72=T79c0ff365Tb4b4b4)Tb4b4b4)
Tff7b72.Td2a8ffadd_extensionTb4b4b4(
Te6edf3x509Tff7b72.Td2a8ffSubjectAlternativeNameTb4b4b4(Te6edf3collect_tls_san_entriesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3criticalTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Tff7b72.Td2a8ffsignTb4b4b4(Te6edf3private_keyTb4b4b4, Te6edf3hashesTff7b72.Td2a8ffSHA256Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3default_backendTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4)
Te6edf3cert_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3cert_pathTb4b4b4)
Tff7b72if Te6edf3cert_dirTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3cert_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3cert_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3certTff7b72.Td2a8ffpublic_bytesTb4b4b4(Te6edf3serializationTff7b72.Td2a8ffEncodingTff7b72.Td2a8ffPEMTb4b4b4)Tb4b4b4)
Te6edf3key_fd Tff7b72= Te6edf3osTff7b72.Td2a8ffopenTb4b4b4(Te6edf3key_pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffO_WRONLY Tff7b72| Te6edf3osTff7b72.Td2a8ffO_CREAT Tff7b72| Te6edf3osTff7b72.Td2a8ffO_TRUNCTb4b4b4, T79c0ff0o600Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffwriteTb4b4b4(
Te6edf3key_fdTb4b4b4,
Te6edf3private_keyTff7b72.Td2a8ffprivate_bytesTb4b4b4(
Te6edf3encodingTff7b72=Te6edf3serializationTff7b72.Td2a8ffEncodingTff7b72.Td2a8ffPEMTb4b4b4,
Tffa657formatTff7b72=Te6edf3serializationTff7b72.Td2a8ffPrivateFormatTff7b72.Td2a8ffPKCS8Tb4b4b4,
Te6edf3encryption_algorithmTff7b72=Te6edf3serializationTff7b72.Td2a8ffNoEncryptionTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3osTff7b72.Td2a8ffcloseTb4b4b4(Te6edf3key_fdTb4b4b4)
Served by rngit 1.4.2 - Generated in 0.02s